package com.chandon.T03_method_reference;

import com.chandon.common.Cv;
import com.chandon.T03_method_reference.function.MethodWithoutArgsReturnFunction;

import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * 实例方法引用
 *  啥是实例方法：
 *   Object o = new Object()
 *   o.method();

 * 如果函数式接口的实现恰好可以通过调用一个实例的方法来实现，那么就可以使用实例方法引用。
 * 人话：某个类的实例，实例方法的功能，恰好是某个函数式接口的功能，就用实例方法引用方式简写。
 *
 *
 * instance::instawnceMethod   (args)->instance.instanceMethod(args)
 *
 *
 * @author Dong
 * @version 1.0
 * @date 2021-04-16 14:18
 */

public class T02_InstanceMethodRef {
    public static void main(String[] args) {

        // 普通写法
        Cv cv = new Cv();
        cv.fun();

        // 无参无返回值
        MethodWithoutArgsReturnFunction fun = cv::fun;
        // 对应lambda写法
        MethodWithoutArgsReturnFunction funLambda = () -> cv.fun();
        funLambda.invoke();

        // 无参有返回值
        Supplier<Integer> ageSupplier = cv::age;
        System.out.println(ageSupplier.get());
        // lambda写法
        Supplier<Integer> ageSupplierLambda = () -> cv.age();

        // 有参数无返回值
        Consumer<String> cvConsumer = cv::setName;
        cvConsumer.accept("asami");
        // lambda写法
        Consumer<String> cvConsumerLambda= s -> cv.setName("asami");

        // 有参数有返回
        Function<Integer ,String> cvFunctin = cv::role;
        System.out.println(cvFunctin.apply(17));




    }

}
